//
//  AUDefaults.swift
//  rrrr
//
//  Created by A on 2025/9/22.
//

import Foundation
import HandyJSON
class AUDefaults {
    static let shared = AUDefaults()
    private init() {}
    
    private let defaults = UserDefaults.standard
    
    // MARK: - 单个模型
        
        /// 存储 HandyJSON 模型
        func setModel<T: HandyJSON>(_ model: T?, forKey key: String) {
            guard let model = model else {
                defaults.removeObject(forKey: key)
                return
            }
            if let jsonString = model.toJSONString() {
                defaults.set(jsonString, forKey: key)
            }
        }
        
        /// 获取 HandyJSON 模型
        func getModel<T: HandyJSON>(_ type: T.Type, forKey key: String) -> T? {
            if let jsonString = defaults.string(forKey: key) {
                return T.deserialize(from: jsonString)
            }
            return nil
        }
        
        // MARK: - 模型数组
        
        /// 存储 HandyJSON 模型数组
        func setModels<T: HandyJSON>(_ models: [T]?, forKey key: String) {
            guard let models = models else {
                defaults.removeObject(forKey: key)
                return
            }
            if let jsonString = models.toJSONString() {
                defaults.set(jsonString, forKey: key)
            }
        }
        
        /// 获取 HandyJSON 模型数组
        func getModels<T: HandyJSON>(_ type: T.Type, forKey key: String) -> [T]? {
            if let jsonString = defaults.string(forKey: key) {
                return [T].deserialize(from: jsonString)?.compactMap { $0 }
            }
            return nil
        }
        
        // MARK: - 基础类型
        
        func set<T>(_ value: T?, forKey key: String) {
            defaults.set(value, forKey: key)
        }
        
        func get<T>(_ key: String) -> T? {
            return defaults.value(forKey: key) as? T
        }
        
        func remove(_ key: String) {
            defaults.removeObject(forKey: key)
        }
    /// 清空所有 UserDefaults（⚠️ 仅清当前 App 的 domain）
       func clearAll() {
           if let bundleID = Bundle.main.bundleIdentifier {
               defaults.removePersistentDomain(forName: bundleID)
               defaults.synchronize()
           }
       }
}

